package top.chmin.project.cloud.common.entity.column.auto;

import org.springframework.stereotype.Repository;
import top.chmin.project.cloud.common.dao.BaseDao;
import top.chmin.project.cloud.common.entity.Condition;
import top.chmin.project.cloud.common.entity.Page;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

/**
 * chmin
 * 2023-12-27 15:10:14
 * cloud-builder
 */
@Repository
public class EntityColumnDao extends BaseDao<EntityColumn> {

    @Override
    public int save(EntityColumn model) {
        StringBuilder sb = new StringBuilder("INSERT INTO bs_entity_column(");
// field column auto
// #bind.field.tableCode#
        sb.append("table_code,");
// $bind.field.tableCode$

// #bind.field.columnType#
        sb.append("column_type,");
// $bind.field.columnType$

// #bind.field.columnLength#
        sb.append("column_length,");
// $bind.field.columnLength$

// #bind.field.columnPrecision#
        sb.append("column_precision,");
// $bind.field.columnPrecision$

// #bind.field.columnScale#
        sb.append("column_scale,");
// $bind.field.columnScale$

// #bind.field.columnNullable#
        sb.append("column_nullable,");
// $bind.field.columnNullable$

// #bind.field.fieldName#
        sb.append("field_name,");
// $bind.field.fieldName$

// #bind.field.columnName#
        sb.append("column_name,");
// $bind.field.columnName$

// #bind.field.methodName#
        sb.append("method_name,");
// $bind.field.methodName$

// #bind.field.simpleType#
        sb.append("simple_type,");
// $bind.field.simpleType$

// #bind.field.fullType#
        sb.append("full_type,");
// $bind.field.fullType$

// #bind.field.remark#
        sb.append("remark,");
// $bind.field.remark$

// #bind.field.dataOrder#
        sb.append("data_order,");
// $bind.field.dataOrder$

// #bind.field.searchOrder#
        sb.append("search_order,");
// $bind.field.searchOrder$

// #bind.field.formOrder#
        sb.append("form_order,");
// $bind.field.formOrder$

// #bind.field.pageColumnOrder#
        sb.append("page_column_order,");
// $bind.field.pageColumnOrder$

// #bind.field.searchExist#
        sb.append("search_exist,");
// $bind.field.searchExist$

// #bind.field.saveExist#
        sb.append("save_exist,");
// $bind.field.saveExist$

// #bind.field.updateExist#
        sb.append("update_exist,");
// $bind.field.updateExist$

// #bind.field.detailExist#
        sb.append("detail_exist,");
// $bind.field.detailExist$

// #bind.field.pageColumnExist#
        sb.append("page_column_exist,");
// $bind.field.pageColumnExist$

// #bind.field.fieldCode#
        sb.append("field_code,");
// $bind.field.fieldCode$

        sb.append("create_by,update_by,create_time,update_time");
        sb.append(") VALUES (");
// field ? auto
// #bind.field.tableCode#
        sb.append("?,"); // table_code
// $bind.field.tableCode$

// #bind.field.columnType#
        sb.append("?,"); // column_type
// $bind.field.columnType$

// #bind.field.columnLength#
        sb.append("?,"); // column_length
// $bind.field.columnLength$

// #bind.field.columnPrecision#
        sb.append("?,"); // column_precision
// $bind.field.columnPrecision$

// #bind.field.columnScale#
        sb.append("?,"); // column_scale
// $bind.field.columnScale$

// #bind.field.columnNullable#
        sb.append("?,"); // column_nullable
// $bind.field.columnNullable$

// #bind.field.fieldName#
        sb.append("?,"); // field_name
// $bind.field.fieldName$

// #bind.field.columnName#
        sb.append("?,"); // column_name
// $bind.field.columnName$

// #bind.field.methodName#
        sb.append("?,"); // method_name
// $bind.field.methodName$

// #bind.field.simpleType#
        sb.append("?,"); // simple_type
// $bind.field.simpleType$

// #bind.field.fullType#
        sb.append("?,"); // full_type
// $bind.field.fullType$

// #bind.field.remark#
        sb.append("?,"); // remark
// $bind.field.remark$

// #bind.field.dataOrder#
        sb.append("?,"); // data_order
// $bind.field.dataOrder$

// #bind.field.searchOrder#
        sb.append("?,"); // search_order
// $bind.field.searchOrder$

// #bind.field.formOrder#
        sb.append("?,"); // form_order
// $bind.field.formOrder$

// #bind.field.pageColumnOrder#
        sb.append("?,"); // page_column_order
// $bind.field.pageColumnOrder$

// #bind.field.searchExist#
        sb.append("?,"); // search_exist
// $bind.field.searchExist$

// #bind.field.saveExist#
        sb.append("?,"); // save_exist
// $bind.field.saveExist$

// #bind.field.updateExist#
        sb.append("?,"); // update_exist
// $bind.field.updateExist$

// #bind.field.detailExist#
        sb.append("?,"); // detail_exist
// $bind.field.detailExist$

// #bind.field.pageColumnExist#
        sb.append("?,"); // page_column_exist
// $bind.field.pageColumnExist$

// #bind.field.fieldCode#
        sb.append("?,"); // field_code
// $bind.field.fieldCode$

        sb.append("?,?,?,?");
        sb.append(")");

        return template.update(sb.toString(),
// field value auto
// #bind.field.tableCode#
                model.getTableCode(),
// $bind.field.tableCode$

// #bind.field.columnType#
                model.getColumnType(),
// $bind.field.columnType$

// #bind.field.columnLength#
                model.getColumnLength(),
// $bind.field.columnLength$

// #bind.field.columnPrecision#
                model.getColumnPrecision(),
// $bind.field.columnPrecision$

// #bind.field.columnScale#
                model.getColumnScale(),
// $bind.field.columnScale$

// #bind.field.columnNullable#
                model.getColumnNullable(),
// $bind.field.columnNullable$

// #bind.field.fieldName#
                model.getFieldName(),
// $bind.field.fieldName$

// #bind.field.columnName#
                model.getColumnName(),
// $bind.field.columnName$

// #bind.field.methodName#
                model.getMethodName(),
// $bind.field.methodName$

// #bind.field.simpleType#
                model.getSimpleType(),
// $bind.field.simpleType$

// #bind.field.fullType#
                model.getFullType(),
// $bind.field.fullType$

// #bind.field.remark#
                model.getRemark(),
// $bind.field.remark$

// #bind.field.dataOrder#
                model.getDataOrder(),
// $bind.field.dataOrder$

// #bind.field.searchOrder#
                model.getSearchOrder(),
// $bind.field.searchOrder$

// #bind.field.formOrder#
                model.getFormOrder(),
// $bind.field.formOrder$

// #bind.field.pageColumnOrder#
                model.getPageColumnOrder(),
// $bind.field.pageColumnOrder$

// #bind.field.searchExist#
                model.getSearchExist(),
// $bind.field.searchExist$

// #bind.field.saveExist#
                model.getSaveExist(),
// $bind.field.saveExist$

// #bind.field.updateExist#
                model.getUpdateExist(),
// $bind.field.updateExist$

// #bind.field.detailExist#
                model.getDetailExist(),
// $bind.field.detailExist$

// #bind.field.pageColumnExist#
                model.getPageColumnExist(),
// $bind.field.pageColumnExist$

// #bind.field.fieldCode#
                model.getFieldCode(),
// $bind.field.fieldCode$

                model.getCreateBy(),
                model.getUpdateBy(),
                model.getCreateTime(),
                model.getUpdateTime()
        );
    }

    @Override
    public int save(List<EntityColumn> list) {
        StringBuilder sb = new StringBuilder("INSERT INTO bs_entity_column(");
// field column auto
// #bind.field.tableCode#
        sb.append("table_code,");
// $bind.field.tableCode$

// #bind.field.columnType#
        sb.append("column_type,");
// $bind.field.columnType$

// #bind.field.columnLength#
        sb.append("column_length,");
// $bind.field.columnLength$

// #bind.field.columnPrecision#
        sb.append("column_precision,");
// $bind.field.columnPrecision$

// #bind.field.columnScale#
        sb.append("column_scale,");
// $bind.field.columnScale$

// #bind.field.columnNullable#
        sb.append("column_nullable,");
// $bind.field.columnNullable$

// #bind.field.fieldName#
        sb.append("field_name,");
// $bind.field.fieldName$

// #bind.field.columnName#
        sb.append("column_name,");
// $bind.field.columnName$

// #bind.field.methodName#
        sb.append("method_name,");
// $bind.field.methodName$

// #bind.field.simpleType#
        sb.append("simple_type,");
// $bind.field.simpleType$

// #bind.field.fullType#
        sb.append("full_type,");
// $bind.field.fullType$

// #bind.field.remark#
        sb.append("remark,");
// $bind.field.remark$

// #bind.field.dataOrder#
        sb.append("data_order,");
// $bind.field.dataOrder$

// #bind.field.searchOrder#
        sb.append("search_order,");
// $bind.field.searchOrder$

// #bind.field.formOrder#
        sb.append("form_order,");
// $bind.field.formOrder$

// #bind.field.pageColumnOrder#
        sb.append("page_column_order,");
// $bind.field.pageColumnOrder$

// #bind.field.searchExist#
        sb.append("search_exist,");
// $bind.field.searchExist$

// #bind.field.saveExist#
        sb.append("save_exist,");
// $bind.field.saveExist$

// #bind.field.updateExist#
        sb.append("update_exist,");
// $bind.field.updateExist$

// #bind.field.detailExist#
        sb.append("detail_exist,");
// $bind.field.detailExist$

// #bind.field.pageColumnExist#
        sb.append("page_column_exist,");
// $bind.field.pageColumnExist$

// #bind.field.fieldCode#
        sb.append("field_code,");
// $bind.field.fieldCode$

        sb.append("create_by,update_by,create_time,update_time");
        sb.append(") VALUES (");
// field ? auto
// #bind.field.tableCode#
        sb.append("?,"); // table_code
// $bind.field.tableCode$

// #bind.field.columnType#
        sb.append("?,"); // column_type
// $bind.field.columnType$

// #bind.field.columnLength#
        sb.append("?,"); // column_length
// $bind.field.columnLength$

// #bind.field.columnPrecision#
        sb.append("?,"); // column_precision
// $bind.field.columnPrecision$

// #bind.field.columnScale#
        sb.append("?,"); // column_scale
// $bind.field.columnScale$

// #bind.field.columnNullable#
        sb.append("?,"); // column_nullable
// $bind.field.columnNullable$

// #bind.field.fieldName#
        sb.append("?,"); // field_name
// $bind.field.fieldName$

// #bind.field.columnName#
        sb.append("?,"); // column_name
// $bind.field.columnName$

// #bind.field.methodName#
        sb.append("?,"); // method_name
// $bind.field.methodName$

// #bind.field.simpleType#
        sb.append("?,"); // simple_type
// $bind.field.simpleType$

// #bind.field.fullType#
        sb.append("?,"); // full_type
// $bind.field.fullType$

// #bind.field.remark#
        sb.append("?,"); // remark
// $bind.field.remark$

// #bind.field.dataOrder#
        sb.append("?,"); // data_order
// $bind.field.dataOrder$

// #bind.field.searchOrder#
        sb.append("?,"); // search_order
// $bind.field.searchOrder$

// #bind.field.formOrder#
        sb.append("?,"); // form_order
// $bind.field.formOrder$

// #bind.field.pageColumnOrder#
        sb.append("?,"); // page_column_order
// $bind.field.pageColumnOrder$

// #bind.field.searchExist#
        sb.append("?,"); // search_exist
// $bind.field.searchExist$

// #bind.field.saveExist#
        sb.append("?,"); // save_exist
// $bind.field.saveExist$

// #bind.field.updateExist#
        sb.append("?,"); // update_exist
// $bind.field.updateExist$

// #bind.field.detailExist#
        sb.append("?,"); // detail_exist
// $bind.field.detailExist$

// #bind.field.pageColumnExist#
        sb.append("?,"); // page_column_exist
// $bind.field.pageColumnExist$

// #bind.field.fieldCode#
        sb.append("?,"); // field_code
// $bind.field.fieldCode$

        sb.append("?,?,?,?");
        sb.append(")");
        return Arrays.stream(template.batchUpdate(sb.toString(),
                list.stream()
                        .map(model -> new Object[]{
// field value auto
// #bind.field.tableCode#
                                model.getTableCode(),
// $bind.field.tableCode$

// #bind.field.columnType#
                                model.getColumnType(),
// $bind.field.columnType$

// #bind.field.columnLength#
                                model.getColumnLength(),
// $bind.field.columnLength$

// #bind.field.columnPrecision#
                                model.getColumnPrecision(),
// $bind.field.columnPrecision$

// #bind.field.columnScale#
                                model.getColumnScale(),
// $bind.field.columnScale$

// #bind.field.columnNullable#
                                model.getColumnNullable(),
// $bind.field.columnNullable$

// #bind.field.fieldName#
                                model.getFieldName(),
// $bind.field.fieldName$

// #bind.field.columnName#
                                model.getColumnName(),
// $bind.field.columnName$

// #bind.field.methodName#
                                model.getMethodName(),
// $bind.field.methodName$

// #bind.field.simpleType#
                                model.getSimpleType(),
// $bind.field.simpleType$

// #bind.field.fullType#
                                model.getFullType(),
// $bind.field.fullType$

// #bind.field.remark#
                                model.getRemark(),
// $bind.field.remark$

// #bind.field.dataOrder#
                                model.getDataOrder(),
// $bind.field.dataOrder$

// #bind.field.searchOrder#
                                model.getSearchOrder(),
// $bind.field.searchOrder$

// #bind.field.formOrder#
                                model.getFormOrder(),
// $bind.field.formOrder$

// #bind.field.pageColumnOrder#
                                model.getPageColumnOrder(),
// $bind.field.pageColumnOrder$

// #bind.field.searchExist#
                                model.getSearchExist(),
// $bind.field.searchExist$

// #bind.field.saveExist#
                                model.getSaveExist(),
// $bind.field.saveExist$

// #bind.field.updateExist#
                                model.getUpdateExist(),
// $bind.field.updateExist$

// #bind.field.detailExist#
                                model.getDetailExist(),
// $bind.field.detailExist$

// #bind.field.pageColumnExist#
                                model.getPageColumnExist(),
// $bind.field.pageColumnExist$

// #bind.field.fieldCode#
                                model.getFieldCode(),
// $bind.field.fieldCode$

                                model.getCreateBy(),
                                model.getUpdateBy(),
                                model.getCreateTime(),
                                model.getUpdateTime()
                        })
                        .toList()
        )).sum();
    }

    @Override
    public int updateById(EntityColumn model) {
        return updateByCondition(model.getPreCondition().forUpdate().id().eq().toCondition());
    }

    @Override
    public int deleteById(Long id) {
        return deleteByCondition(new EntityColumnFPC().forDelete().id().eq(id).toCondition());
    }

    @Override
    public int deleteById(List<Long> list) {
        return deleteByCondition(new EntityColumnFPC().forDelete().id().in(list).toCondition());
    }

    @Override
    public EntityColumn getById(Long id) {
        return getStreamByCondition(new EntityColumnFPC().id().eq(id).toCondition(), EntityColumn.class).findFirst().orElse(null);
    }

    @Override
    public List<EntityColumn> getListById(List<Long> list) {
        return getStreamByCondition(new EntityColumnFPC().id().in(list).toCondition(), EntityColumn.class).toList();
    }

    @Override
    public EntityColumn getFirst(Condition condition) {
        return getFirst(condition, EntityColumn.class);
    }

    @Override
    public Stream<EntityColumn> getStreamByCondition(Condition condition) {
        return getStreamByCondition(condition, EntityColumn.class);
    }

    @Override
    public Page<EntityColumn> getPageByCondition(Condition condition) {
        return getPageByCondition(condition, EntityColumn.class);
    }
}
